package 代理学习;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

@SuppressWarnings("all")
public class Test {
    public static void main(String[] args) {
        //准备一个目标类
        Customer c = new Customer();
        //使用JDK的api来生成
        OrderInterface diver = (OrderInterface) Proxy.newProxyInstance(
                c.getClass().getClassLoader(),  //第一个是指定的目标类对象的类加载器
                c.getClass().getInterfaces(),   //指定目标类实现的所有接口的字节码对象数组
                new InvocationHandler() {
                    @Override
                    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                        /*
                         * proxy : 代理类对象的一个引用
                         * method : 这个就是代理类对象执行的方法
                         * args[] : 参数列表
                         * */
                        if (method.getName().equals("order")) {
                            System.out.println("执行到指定的方法了");
                            return method.invoke(c, args);
                        } else {
                            return method.invoke(c, args);
                        }
                        //调用方法返回结果

                    }
                }// 一个接口,会在代理类对象调用方法时执行到invoke
        );
        //这里使用多态,然后就可以使用代理对象来调用方法了
        String result = diver.order("麻婆");
        System.out.println(result);
    }
}
